package com.gblfy.service.impl;

import com.gblfy.consts.FileTypeConst;
import com.gblfy.service.IPreviewService;
import com.gblfy.utils.FileConvertUtil;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 在线预览处理类
 *
 * @author gblfy
 * @date 2021-10-28
 */
@Service
public class PreviewServiceImpl implements IPreviewService {

    /**
     * 文件在线预览
     *
     * @param fileUrl  预览的文件路径
     * @param response 以pdf文件流的形式返回浏览器完成预览操作
     * @throws Exception
     */
    @Override
    public void onlinePreview(String fileUrl, HttpServletResponse response) throws IOException {
        //对url中文件名称进行统一编码，解决400问题
        String uRLEncoder = FileConvertUtil.encodeUrlFileName(fileUrl);

        //获取文件类型 注意不要携带.
        String suffix = FileConvertUtil.suffixFromFileName(uRLEncoder);
        if (!FileTypeConst.TXT.equals(suffix) && !FileTypeConst.DOC.equals(suffix)
                && !FileTypeConst.DOCX.equals(suffix) && !FileTypeConst.XLS.equals(suffix)
                && !FileTypeConst.XLSX.equals(suffix) && !FileTypeConst.PPT.equals(suffix)
                && !FileTypeConst.PPTX.equals(suffix)) {
            throw new RuntimeException("该文件格式不支持预览");
        }

        //文件转换处理
        InputStream in = FileConvertUtil.convertNetFile(uRLEncoder, suffix);
        OutputStream outputStream = response.getOutputStream();

        //创建存放文件内容的数组
        byte[] buff = new byte[1024];
        //所读取的内容使用n来接收
        int n;
        //当没有读取完时,继续读取,循环
        while ((n = in.read(buff)) != -1) {
            //将字节数组的数据全部写入到输出流中
            outputStream.write(buff, 0, n);
        }
        //强制将缓存区的数据进行输出
        outputStream.flush();
        //关流
        outputStream.close();
        in.close();
    }
}
